perm filename HASH.PAS[S1,ALS] blob
sn#458948 filedate 1979-07-17 generic text, type C, neo UTF8
COMMENT ā VALID 00004 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 (*PROGRAM HEADER PAGE*)
C00005 00003 program PRINTHASH (INPUT,OUTPUT)
C00008 00004 function OPC_HASH (var MNEM : CHAR4) : integer
C00018 ENDMK
Cā;
(*PROGRAM HEADER PAGE*)
(*PAS10 OPTIONS*) (*$D+,R32,S1300*) (*X10S1*)
(* DEFAULT
D+ DEBUG AND POSTMORTEM DUMP -
E+ EXTERNAL CALLS TO LEVEL 1 PROCEDURES ALLOWED -
Fn FILE OPTION 1
I+ FORTRAN I/O IN EXTERNAL FORTRAN SUBROUTINES -
L+ OBJECT LISTING -
Rn SIZE OF LOW-SEGMENT (SEE PAS10 MANUAL)
Sn MAX INSTRUCTIONS PER STATEMENT 1000
T+ RUNTIME CHECK +
U+ 72 COLUMN FORMAT -
Xn HIGHEST REGISTER FOR PARAMETERS 6
*)
(*SLAC PCPASC OPTIONS*) (* B+,D+,M-*)
(* DEFAULT
A+ GENERATE 370 OBJECT MODULE -
A- GENERATE 370 ASSEMBLY MODULE
B+ BOUNDS CHECKING, BUT ALLOW 'BIG' CHARACTERS -
C+ EMIT PCODE +
D+ RUNTIME CHECKING OF POINTER, INDEX, SUBRANGE VALUES -
E+ FILE IS IN EBCDIC CHARACTER SET -
F+ SAVE FPR'S ON PROCEDURE/FUNCTION ENTRY +
K+ ENABLE STATEMENT EXECUTION COUNTING -
L+ LIST SOURCE PROGRAM +
M+ 72 COLUMN FORMAT +
P+ DOUBLE-WORD BOUNDARY ALIGNMENT -
S+ SAVE GPR'S ON PROCEDURE/FUNCTION ENTRY +
T+ PRINT SYMBOL TABLES (FOR POST-PROCESSOR) -
U+ GET STATISTICS?? 2ND PARAMETER TO PCODE BGN INSTR. -
V+ ?? 3RD PCODE BGN INSTRUCTION PARAMETER -
X+ USE ACTUAL PROCEDURE NAMES FOR EXTERNAL REFERENCES -
X- GENERATE UNIQUE 8-CHAR NAMES FOR EXTERNAL REFERENCES
*)
(*S1 PCPASC OPTION DIFFERENCES*) (* A+,B+,D+,L-,M120*) (*X10S1*)
(* DEFAULT
A+ GENERATE S1 ASSEMBLY MODULE -
A- GENERATE S1 OBJECT MODULE
*)
(* SLAC/PDP-10 TRANSPORT DEPENDENCIES FLAGGED WITH "XSL10" *)
(* PDP-10/S-1 TRANSPORT DEPENDENCIES FLAGGED WITH "X10S1" *)
program PRINTHASH (INPUT,OUTPUT);
(* Fixed for new opc list 6july79 *)
const
(*OPCHTSIZE = 257;
OPCHTSIZEM1 = 256; *)
OPCHTSIZE = 263;
OPCHTSIZEM1 = 262;
(*OPCHTSIZE = 223;
OPCHTSIZEM1 = 222; *)
(*OPCHTSIZE = 239;
OPCHTSIZEM1 = 238;*)
MAX1 = 200000;
MAX2 = 20000;
MAX3 = 2000;
MAX4 = 2000;
type
CHAR4 = packed array [1..4] of char;
U_OPCODE = (U ,
UABS ,UADD ,USUB ,UMPY ,UDIV ,UADJ ,UAND ,UBGN ,UBGNB,UCHKF,
UCHKH,UCHKL,UCHKN,UCHKT,UCLAB,UCOMM,UCSP ,UCUP ,UCVT ,UCVT2,
UDEAD,UDEC ,UDEF ,UDIF ,UDMD ,UDOA ,UDSP ,UDUP ,UEND ,UENDB,
UENT ,UEXPP,UEXPV,UFJP ,UICUP,UGOOB,UMOV ,UEQU ,UNEQ ,UGEQ ,
ULES ,UIEQU,UINEQ,UIGEQ,UIGRT,UILEQ,UILES,UILOD,UIMOV,UIMPP,
UIMPV,UINC ,UINN ,UINST,UINT ,UIOR ,UISTR,UIXA ,ULAB ,ULCA ,
ULDA ,ULDC ,ULDP ,ULEX ,ULIVE,ULOC ,ULOD ,UMDEF,UMOD ,UMST ,
UMUS ,UNEG ,UNEW ,UNOT ,UNSTR,UODD ,UOPTN,UPAR ,UPLEX,UPLOD,
UPSTR,URET ,URND ,USDEF,USGS ,USQR ,USTP ,USTR ,USWP ,USYM ,
UTJP ,UTYP ,UTYP2,UUJP ,UUNI ,UUNK ,UXJP ,UXOR ,UGRT ,ULEQ );
var
I : 0..OPCHTSIZEM1;
H : 0..OPCHTSIZEM1;
J : integer;
K : integer;
L : integer;
M,M1,M2,M3,M4 : integer;
OPC : U_OPCODE;
MNEM : CHAR4; (*7FEB79 ALS*)
OPCHASHTAB : array [0..OPCHTSIZEM1] of
record
OPCNAM : CHAR4;
OPCHIT1 : CHAR4;
OPCHIT2 : CHAR4;
OPC : U_OPCODE;
HIT : integer;
STEP : integer;
end (*OPCHASHTAB*);
function OPC_HASH (var MNEM : CHAR4) : integer;
var
I : integer;
TMP1 : integer;
TMP2 : integer;
begin
OPC_HASH :=(ord(MNEM[1])*M1 + ord(MNEM[2])*M2 + ord(MNEM[3])*M3
+ord(MNEM[4])*M4) mod OPCHTSIZE;
(* OPC_HASH := (ord(MNEM[1])*507 + ord(MNEM[2])*26 + ord(MNEM[3])
+ord(MNEM[4])*31) mod OPCHTSIZE; *)
(**** The best so far with 263 in table
M1 M2 M3 M4 TOTAL HITS MAX. STEPS
512 2048 64 8 9 HITS 1 *)
(* OPC_HASH := ((( ord(MNEM[2])*4 + ord(MNEM[1]))*8 + ord(MNEM[3]))*8
+ord(MNEM[4])*8) mod OPCHTSIZE; *)
(*
TMP1 := 0;
for I := 1 to 4 do TMP1 :=(3 * TMP1) + ORD(MNEM[I]);
TMP2 := TMP1 div OPCHTSIZE;
TMP1 := TMP1 mod OPCHTSIZE;
OPC_HASH := (TMP1 + TMP2) mod OPCHTSIZE;
*)
end (*OPC_HASH*);
procedure ENTER_OPC (NAM : CHAR4; OPC : U_OPCODE);
var H : 0..OPCHTSIZEM1;
begin
H := OPC_HASH(NAM);
L := 0;
while OPCHASHTAB[H].OPCNAM <> ' ' do
begin
H := (H + 1) mod OPCHTSIZE;
OPCHASHTAB[H].OPCHIT2 := OPCHASHTAB[H].OPCHIT1;
OPCHASHTAB[H].OPCHIT1 := OPCHASHTAB[H-1].OPCNAM;
J := J + 1;
L := L + 1;
end;
if L > M then M := L;
OPCHASHTAB[H].OPCNAM := NAM;
OPCHASHTAB[H].OPC := OPC;
(* OPCHASHTAB[H].HIT := K; *)
OPCHASHTAB[H].STEP := L;
end (*ENTER_OPC*);
procedure PRINT_OPC;
var H : 0..OPCHTSIZEM1;
begin
WRITELN;
for H := 0 to OPCHTSIZEM1 do
(* begin
WRITE (OUTPUT,H,' '); *)
if OPCHASHTAB[H].STEP > 0 then
begin
WRITELN (OUTPUT,H,OPCHASHTAB[H].OPCNAM,
OPCHASHTAB[H].OPCHIT1,OPCHASHTAB[H].OPCHIT2);
WRITELN (TTY,H,OPCHASHTAB[H].OPCNAM,
OPCHASHTAB[H].OPCHIT1,OPCHASHTAB[H].OPCHIT2); BREAK;
end;
(* if OPCHASHTAB[H].OPCNAM = ' ' then WRITELN else
begin
WRITELN (OUTPUT,OPCHASHTAB[H].OPCNAM,OPCHASHTAB[H].OPC);
if OPCHASHTAB[H].HIT = 0 then WRITELN else
WRITE (OUTPUT,OPCHASHTAB[H].HIT);
if OPCHASHTAB[H].STEP = 0 then WRITELN else
WRITELN (OUTPUT,OPCHASHTAB[H].STEP);
end;
end;*)
end;
begin (*MAIN PROGRAM*)
J := 0;
K := 1000;
M1 := 512;
while(( M1 <= MAX1 ) and (k > 9 )) do
begin (* while M1 <= MAX1 *)
M2 := 512;
while (M2 <= MAX2) do
begin
M3 := 1;
while( M3 <= MAX3) do
begin
M4 := 1;
while ( M4 <= MAX4) do
begin
for I := 0 to OPCHTSIZEM1 do
begin
OPCHASHTAB[I].OPCNAM := ' ';
OPCHASHTAB[I].OPCHIT1 := ' ';
OPCHASHTAB[I].OPCHIT2 := ' ';
OPCHASHTAB[I].STEP := 0 ;
OPCHASHTAB[H].HIT := 0 ;
end;
J := 0;
ENTER_OPC ('ABS ', UABS); ENTER_OPC ('ADD ', UADD);
ENTER_OPC ('SUB ', USUB); ENTER_OPC ('MPY ', UMPY);
ENTER_OPC ('DIV ', UDIV); ENTER_OPC ('ADJ ', UADJ);
ENTER_OPC ('AND ', UAND); ENTER_OPC ('BGN ', UBGN);
ENTER_OPC ('BGNB', UBGNB); ENTER_OPC ('CHKF', UCHKF);
ENTER_OPC ('CHKH', UCHKH); ENTER_OPC ('CHKL', UCHKL);
ENTER_OPC ('CHKN', UCHKN); ENTER_OPC ('CHKT', UCHKT);
ENTER_OPC ('CLAB', UCLAB); ENTER_OPC ('COMM', UCOMM);
ENTER_OPC ('CSP ', UCSP); ENTER_OPC ('CUP ', UCUP);
ENTER_OPC ('CVT ', UCVT); ENTER_OPC ('CVT2', UCVT2);
ENTER_OPC ('DEAD', UDEAD); ENTER_OPC ('DEC ', UDEC);
ENTER_OPC ('DEF ', UDEF); ENTER_OPC ('DIF ', UDIF);
ENTER_OPC ('DMD ', UDMD); ENTER_OPC ('DOA ', UDOA);
ENTER_OPC ('DSP ', UDSP); ENTER_OPC ('DUP ', UDUP);
ENTER_OPC ('END ', UEND); ENTER_OPC ('ENDB', UENDB);
ENTER_OPC ('ENT ', UENT); ENTER_OPC ('EXPP', UEXPP);
ENTER_OPC ('EXPV', UEXPV); ENTER_OPC ('FJP ', UFJP);
ENTER_OPC ('ICUP', UICUP); ENTER_OPC ('GOOB', UGOOB);
ENTER_OPC ('MOV ', UMOV); ENTER_OPC ('EQU ', UEQU);
ENTER_OPC ('NEQ ', UNEQ); ENTER_OPC ('GEQ ', UGEQ);
ENTER_OPC ('LES ', ULES); ENTER_OPC ('IEQU', UIEQU);
ENTER_OPC ('INEQ', UINEQ); ENTER_OPC ('IGEQ', UIGEQ);
ENTER_OPC ('IGRT', UIGRT); ENTER_OPC ('ILEQ', UILEQ);
ENTER_OPC ('ILES', UILES); ENTER_OPC ('ILOD', UILOD);
ENTER_OPC ('IMOV', UIMOV); ENTER_OPC ('IMPP', UIMPP);
ENTER_OPC ('IMPV', UIMPV); ENTER_OPC ('INC ', UINC);
ENTER_OPC ('INN ', UINN); ENTER_OPC ('INST', UINST);
ENTER_OPC ('INT ', UINT); ENTER_OPC ('IOR ', UIOR);
ENTER_OPC ('ISTR', UISTR); ENTER_OPC ('IXA ', UIXA);
ENTER_OPC ('LAB ', ULAB); ENTER_OPC ('LCA ', ULCA);
ENTER_OPC ('LDA ', ULDA); ENTER_OPC ('LDC ', ULDC);
ENTER_OPC ('LDP ', ULDP); ENTER_OPC ('LEX ', ULEX);
ENTER_OPC ('LIVE', ULIVE); ENTER_OPC ('LOC ', ULOC);
ENTER_OPC ('LOD ', ULOD); ENTER_OPC ('MDEF', UMDEF);
ENTER_OPC ('MOD ', UMOD); ENTER_OPC ('MST ', UMST);
ENTER_OPC ('MUS ', UMUS); ENTER_OPC ('NEG ', UNEG);
ENTER_OPC ('NEW ', UNEW); ENTER_OPC ('NOT ', UNOT);
ENTER_OPC ('NSTR', UNSTR); ENTER_OPC ('ODD ', UODD);
ENTER_OPC ('OPTN', UOPTN); ENTER_OPC ('PAR ', UPAR);
ENTER_OPC ('PLEX', UPLEX); ENTER_OPC ('PLOD', UPLOD);
ENTER_OPC ('PSTR', UPSTR); ENTER_OPC ('RET ', URET);
ENTER_OPC ('RND ', URND); ENTER_OPC ('SDEF', USDEF);
ENTER_OPC ('SGS ', USGS); ENTER_OPC ('SQR ', USQR);
ENTER_OPC ('STP ', USTP); ENTER_OPC ('STR ', USTR);
ENTER_OPC ('SWP ', USWP); ENTER_OPC ('SYM ', USYM);
ENTER_OPC ('TJP ', UTJP); ENTER_OPC ('TYP ', UTYP);
ENTER_OPC ('TYP2', UTYP2); ENTER_OPC ('UJP ', UUJP);
ENTER_OPC ('UNI ', UUNI); ENTER_OPC ('UNK ', UUNK);
ENTER_OPC ('XJP ', UXJP); ENTER_OPC ('XOR ', UXOR);
ENTER_OPC ('GRT ', UGRT); ENTER_OPC ('LEQ ', ULEQ);
if J < K then
begin
K := J;
WRITELN (OUTPUT,M1,M2,M3,M4,K);
WRITELN (TTY,M1,M2,M3,M4,K); BREAK;
if K < 11 then PRINT_OPC;
end; (* if J < K then *)
M := 0;
M4 := M4*2;
end; (* while M4 <= MAX do *)
M3 := M3*2;
end; (* while M4*M3 <= NAX do *)
M2 := M2*2;
end; (* while M4*M3*M2 <= MAX do *)
M1 := M1*2;
end; (* WHILE M1 <= MAX *)
end. (* main*)